package Midium;

//48.旋转图像
//注：必须原地旋转
public class Solution48 {
    public void rotate(int[][] matrix) {
        __rotate(0,matrix);
    }

    public void __rotate(int start, int[][] matrix) {
        //四条边的起始点，对应四条边，分别用一条边来保存四条边，然后依次旋转覆盖。
        //如果四条边的起始点相同，则说明这是最后一次调用本方法
        //四个点分别为(a1,b1),(a2,b2),(a3,b3),(a4,b4)
        int a1 = start, b1 = start;
        int a2 = start, b2 = matrix.length - start - 1;
        int a3 = matrix.length - start - 1, b3 = matrix.length - start - 1;
        int a4 = matrix.length - start - 1, b4 = start;

        if (a2 == a3 || b1 - 1 == b2)//最后一次调用
            return;
        //int[] edge = new int[matrix.length];
        int temp; //其实用一个数也可以代替edge的工作，这样就是O(1)的空间复杂度啦
        //开始旋转覆盖
        for (int i = a2, j = b1, k = b3, l = a4; i < a3; i++, j++, k--, l--) {
            temp = matrix[i][b2];
            matrix[i][b2] = matrix[a1][j];

            int swap = temp;
            temp = matrix[a3][k];
            matrix[a3][k] = swap;

            swap = temp;
            temp = matrix[l][b4];
            matrix[l][b4] = swap;

            swap=temp;
            temp = matrix[a1][j];
            matrix[a1][j]=swap;
        }
        __rotate(++start,matrix);
    }
}
